package com.kjlink.widget.monitoring.processor;

import com.kjlink.common.base.tool.Tools;
import com.kjlink.common.util.JsonUtil;
import com.kjlink.widget.monitoring.enums.MonitorTypeEnum;
import com.kjlink.widget.monitoring.model.MonitorDataModel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.Assert;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * 描述:
 * 监控事件发送者
 *
 * @author Vic.xu
 * @since 2025-08-01 15:49
 */
public class MonitorEventSender extends BaseMonitorEventProcessor {

    public MonitorEventSender(StringRedisTemplate stringRedisTemplate) {
        super(stringRedisTemplate);
    }

    /**
     * 发送监控事件 到redis
     * @return  key for redis
     */
    public String sendEvent(MonitorDataModel monitorDataModel) {
        return sendEvent(monitorDataModel, getTtl());
    }

    /**
     * 发送监控事件 到redis
     *
     * @param ttl 缓存时间 秒
     */
    public String sendEvent(MonitorDataModel monitorDataModel, int ttl) {
        Assert.notNull(monitorDataModel, "monitorDataModel can not be null");
        // 事件类型不可为null
        Assert.notNull(monitorDataModel.getEventType(), "monitorDataModel.eventType can not be null");
        // 错误代码不可为null
        Assert.notNull(monitorDataModel.getEventCode(), "monitorDataModel.eventCode can not be null");
       // 发生地点不可为null
        Assert.notNull(monitorDataModel.getOccurPlace(), "monitorDataModel.occurPlace can not be null");
        //创建人不可为null
        Assert.notNull(monitorDataModel.getCreatedBy(), "monitorDataModel.createdBy can not be null");

        //补全数据
        completeDefaultField(monitorDataModel);
        String key = buildKey(monitorDataModel);
        String value = JsonUtil.toJson(monitorDataModel);
        stringRedisTemplate.opsForValue().set(key, value, ttl, TimeUnit.SECONDS);
        logger.info("send event success: key={}, value =  \n\t {}", key, value);
        return key;
    }

    /**
     * 做一些数据补全:
     * <p>
     * 1. 默认 开放平台应用监控
     * 2. 设置事件id
     * 3. 默认事件发生时间为当前时间
     * 4. 默认业务类型为 事件类型
     * 5. 默认交易代码为 事件类型
     * 6. 默认资源代码为 事件类型
     * </p>
     */
    public void completeDefaultField(MonitorDataModel monitorDataModel) {
        String code = monitorDataModel.getEventType().getCode();
        // 1默认 开放平台应用监控
        if (monitorDataModel.getMonitorType() == null) {
            monitorDataModel.setMonitorType(MonitorTypeEnum.OPEN_PLATFORM);
        }
        //  2 设置事件id
        if (StringUtils.isBlank(monitorDataModel.getEventId())) {
            monitorDataModel.setEventId(Tools.randomUuid());
        }
        // 3 默认当前时间 为事件发生事件
        if (monitorDataModel.getOccurTime() == null) {
            monitorDataModel.setOccurTime(LocalDateTime.now());
        }
        // 4 默认业务类型为 事件类型
        if (StringUtils.isBlank(monitorDataModel.getBusinessType())) {
            monitorDataModel.setBusinessType(code);
        }
        // 5 交易代码默认为 事件类型
        if (StringUtils.isBlank(monitorDataModel.getTranCode())) {
            monitorDataModel.setTranCode(code);
        }
        // 6 默认资源代码为 事件类型
        if (StringUtils.isBlank(monitorDataModel.getResourceCode())) {
            monitorDataModel.setResourceCode(code);
        }
    }

}
